/*
 *  Copyright 2004 Clinton Begin
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package com.ibatis.sqlmap.client.extensions;

import java.io.InputStream;
import java.io.Reader;
import java.math.BigDecimal;
import java.net.URL;
import java.sql.*;
import java.util.Calendar;

/**
 * Allows parameters to be set on the underlying prepared statement.
 * TypeHandlerCallback implementations use this interface to
 * process values before they are set on the prepared statement.
 * Each of these methods has a corresponding method on the
 * PreparedStatement class, the only difference being
 * that there is no need to specify the parameter index with these
 * methods.
 * <p/>
 * <b>NOTE:</b> There is no need to implement this.  The implementation
 * will be passed into the TypeHandlerCallback automatically.
 */
public interface ParameterSetter {

    /**
     * Set an array on the underlying prepared statement
     * @param x - the array to set
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setArray(Array x) throws SQLException;

    /**
     * Set an InputStream on the underlying prepared statement
     * @param x - the InputStream
     * @param length - the length of the InputStream
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setAsciiStream(InputStream x, int length) throws SQLException;

    /**
     * Set an on the underlying prepared statement
     * @param x
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setBigDecimal(BigDecimal x) throws SQLException;

    /**
     * Set an InputStream on the underlying prepared statement
     * @param x - the InputStream 
     * @param length - the length of the InputStream
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setBinaryStream(InputStream x, int length) throws SQLException;

    /**
     * Set a blob on the underlying prepared statement
     * @param x - the blob
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setBlob(Blob x) throws SQLException;

    /**
     * Set a boolean on the underlying prepared statement
     * @param x - the boolean
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setBoolean(boolean x) throws SQLException;

    /**
     * Set a byte on the underlying prepared statement
     * @param x - the byte
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setByte(byte x) throws SQLException;

    /**
     * Set a byte array on the underlying prepared statement
     * @param x - the byte[]
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setBytes(byte x[]) throws SQLException;

    /**
     * Set a character stream on the underlying prepared statement
     * @param reader - the reader
     * @param length - the length of the reader
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setCharacterStream(Reader reader, int length) throws SQLException;

    /**
     * Set a clob on the underlying prepared statement
     * @param x - the clob
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setClob(Clob x) throws SQLException;

    /**
     * Set a date on the underlying prepared statement
     * @param x - the date
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setDate(Date x) throws SQLException;

    /**
     * Set a date with a calendar on the underlying prepared statement
     * @param x - the date
     * @param cal - the calendar
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setDate(Date x, Calendar cal) throws SQLException;

    /**
     * Set a double on the underlying prepared statement
     * @param x - the double
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setDouble(double x) throws SQLException;

    /**
     * Set a float on the underlying prepared statement
     * @param x the float
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setFloat(float x) throws SQLException;

    /**
     * Set an integer on the underlying prepared statement
     * @param x - the int
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setInt(int x) throws SQLException;

    /**
     * Set a long on the underlying prepared statement
     * @param x - the long
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setLong(long x) throws SQLException;

    /**
     * Set a null on the underlying prepared statement
     * @param sqlType - the type for the null value
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setNull(int sqlType) throws SQLException;

    /**
     * Set a null on the underlying prepared statement
     * @param sqlType -  the type for the null value
     * @param typeName -  the name of the type
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setNull(int sqlType, String typeName) throws SQLException;

    /**
     * Set an object on the underlying prepared statement
     * @param x - the object to set
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setObject(Object x) throws SQLException;

    /**
     * Set an object on the underlying prepared statement
     * @param x - the object to set
     * @param targetSqlType - the sql type of the object
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setObject(Object x, int targetSqlType) throws SQLException;

    /**
     * Set an object on the underlying prepared statement
     * @param x - the object to set
     * @param targetSqlType - the sql type of the object
     * @param scale - the scale of the object
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setObject(Object x, int targetSqlType, int scale) throws SQLException;

    /**
     * Set a reference on the underlying prepared statement
     * @param x - the reference to set
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setRef(Ref x) throws SQLException;

    /**
     * Set a short on the underlying prepared statement
     * @param x - the short to set
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setShort(short x) throws SQLException;

    /**
     * Set a string on the underlying prepared statement
     * @param x - the string to set
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setString(String x) throws SQLException;

    /**
     * Set a time on the underlying prepared statement
     * @param x - the time to set
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setTime(Time x) throws SQLException;

    /**
     * Set a time with a calendar on the underlying prepared statement
     * @param x - the time to set
     * @param cal - the calendar to use
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setTime(Time x, Calendar cal) throws SQLException;

    /**
     * Set a timestamp on the underlying prepared statement
     * @param x - the timestamp to set
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setTimestamp(Timestamp x) throws SQLException;

    /**
     * Set a timestamp on the underlying prepared statement
     * @param x - the timestamp to set
     * @param cal - the calendar to use
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setTimestamp(Timestamp x, Calendar cal) throws SQLException;

    /**
     * Set a URL on the underlying prepared statement
     * @param x - the url to set
     * @throws SQLException - thrown if the underlying prepared statement throws it
     */
    public void setURL(URL x) throws SQLException;

    /**
     * Returns the underlying prepared statement...be careful!
     */
    public PreparedStatement getPreparedStatement();

    /**
     * Returns the index of the parameter being set.
     * 
     * @return the parameter index used to set the value in the underlying
     *   PreparedStatement
     */
    public int getParameterIndex();
}
